Все ниже описанные примеры (загружайте проект с расширением sln) работают в Visual Studio .NET Enterprise Architech и под операционную систему WindowsXP Professional (русская версия), так что владельцам Visual Studio 6.0 придеться переехать в данный новый пакет, если хотите загрузить исходники кода и сразу их скомпоновать. В VS 6.0 не должно возникнуть никаких проблем, если Вы еще установили в придачу DirectX 8.0 SDK, но лучше DirectX 8.1 SDK который можно взять с http://www.microsoft.com/, но придется Вам шагать с первого и по последний, с середины не начать... хотя не долго все это подправить.
Первое, что мы сделаем, это пустое приложение которое начнем постепенно усложнять наращивая его различными функциями. Итак, зайдите в Visual Studio .NET и создайте новый проект Visual C++ нажав на кнопку New Project (Новый Проект):

Выберите в разделе Project Types (Тип Проекта) раздел Visual C++ Projects и справа в разделе Templates выберите Win32 Project. В поле Name введите, к примеру, 01:

И нажмите ОК. В появившемся окне Win32 Application Wizard - 01 выберите раздел Application Settings (Установки Приложения), установите Windows Application (Оконное Приложение) и в дополнительных опциях укажите Empty Project (Пустой Проект) и нажмите кнопку Finish (Финиш).

Добавьте в него файл, скажем 01.cpp и вставьте ниже следующий код:
//----------------------------------------------------
//
// Проект -> Урок 01 - Инициализация Приложения
// Адрес -> http://www.firststeps.ru
// Последние обновление 30.07.2002
//
//----------------------------------------------------
#define APPNAME "http://www.firststeps.ru Первые Шаги Урок 01 - Инициализцаия Приложения"
#define APPTITLE "http://www.firststeps.ru Первые Шаги Урок 01 - Инициализация Приложения"
#define _RELEASE_(p) { if(p) { (p)->Release(); (p)=NULL; };};
#define _DELETE_(p) { if(p) { delete (p); (p)=NULL; };};
#include <windows.h>
HWND hWnd;
//---------------------------------
// Name: WindowProc ()
// Desc:
//---------------------------------
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage (0);
break;
case WM_SETCURSOR:
SetCursor (NULL);
break;
};
return DefWindowProc(hWnd, message, wParam, lParam);
};
//---------------------------------
// Name: WindowInit ()
// Desc:
//---------------------------------
bool WindowInit (HINSTANCE hThisInst, int nCmdShow)
{
WNDCLASS wcl;
wcl.hInstance = hThisInst;
wcl.lpszClassName = APPNAME;
wcl.lpfnWndProc = WindowProc;
wcl.style = 0;
wcl.hIcon = LoadIcon (hThisInst, IDC_ICON);
wcl.hCursor = LoadCursor (hThisInst, IDC_ARROW);
wcl.lpszMenuName = NULL;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
RegisterClass (&wcl);
hWnd = CreateWindowEx (
WS_EX_TOPMOST,
APPNAME,
APPTITLE,
WS_OVERLAPPEDWINDOW,
0, 0,
640,
480,
NULL,
NULL,
hThisInst,
NULL);
if(!hWnd) return false;
return true;
};
//---------------------------------
// Name: AppInit()
// Desc: Initializes Aplication
//---------------------------------
bool AppInit (HINSTANCE hThisInst, int nCmdShow)
{
if(!WindowInit (hThisInst, nCmdShow)) return false;
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);
return true;
};
//---------------------------------
// Name: WinMain ()
// Desc:
//---------------------------------
int APIENTRY WinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
if(!AppInit (hThisInst, nCmdShow)) return false;
while (1)
{
if(PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage (&msg, NULL, 0, 0)) break;
TranslateMessage (&msg);
DispatchMessage (&msg);
}
};
return 0;
};
//---------------------------------
// EOF
//---------------------------------
Компилируем, запускаем, вот что у нас должно в итоге получиться:

Заметьте, что курсор мышки пропадает в окне приложения, за его пределами снова появляется.
Это случилось потому, что функция WindowProc есть три строчки кода:
case WM_SETCURSOR: SetCursor (NULL); break;
которые убирают стандартный курсор с экрана, чтобы он нам не мешал.
Так же в самом начале кода есть два макроса:
#define _RELEASE_(p) { if(p) { (p)->Release(); (p)=NULL; };};
#define _DELETE_(p) { if(p) { delete (p); (p)=NULL; };};
которые освобождают использованные интерфейсы и удаляет динамические массивы (обращение на удаление создадим позже, пока только объявим).
Краткое описание функций:
С функцией WinMain не должно возникнуть никаких проблем.
Здесь я сделал простую заготовку над которой мы и начнем свои познания... итак, поехали в DirectX :)